home *** CD-ROM | disk | FTP | other *** search
/ Network Support Library / RoseWare - Network Support Library.iso / apidev / locks.arc / DOS_LOCK.C next >
Text File  |  1989-04-19  |  3KB  |  157 lines

  1. /* Functions for physical record locking/unlocking for NETWORK files */
  2. #include <dos.h>
  3. #include <fcntl.h>
  4. #include <stdio.h>
  5.  
  6. struct temp
  7. {
  8.   int handle;
  9.   long start;
  10.   long blk_size;
  11. } lock_log[256];
  12.  
  13. int locks_on=0;
  14.  
  15. /* Return lo word of a long
  16. */
  17. unsigned lo(l)
  18. long l;
  19. {
  20.   return(l&0xFFFF);
  21. };
  22.  
  23. /* Return hi word of a long
  24. */
  25. unsigned hi(l)
  26. long l;
  27. {
  28.   return(l>>16);
  29. };
  30.  
  31. /* Set locking mode
  32. */
  33. set_lock_mode()
  34. {
  35. struct REGPACK regs;
  36.   regs.r_ax = 0xC601;
  37.   intr(0x21,®s);
  38. };
  39.  
  40. /* Log and lock a record
  41. */
  42. int dos_lock(handle,start,blk_size)
  43. int handle;
  44. long start;
  45. long blk_size;
  46. {
  47.   if(lock(handle,start,blk_size))
  48.     return(0);
  49.   else
  50.   {
  51.     lock_log[locks_on].handle = handle;
  52.     lock_log[locks_on].start = start;
  53.     lock_log[locks_on].blk_size = blk_size;
  54.     locks_on++;
  55.   }
  56.   return(1);
  57. };
  58.  
  59. /* Clear the records that have been logged or locked
  60. */
  61. int clear_recs()
  62. {
  63. int i;
  64.   for (i=0;i!=locks_on;i++)
  65.     unlock(lock_log[i].handle,lock_log[i].start,lock_log[i].blk_size);
  66.   locks_on = 0;
  67.   return(1);
  68. };
  69.  
  70. main()
  71. {
  72. char c;
  73. int start;
  74. int blk_size;
  75. int timeout;
  76. int handle;
  77. char buff[256];
  78. int i;
  79. int flgs;
  80.   handle = open("test.dat",O_RDWR|O_DENYNONE|O_BINARY);
  81.   ioctl(handle,11,1,1);
  82.   while (!0)
  83.   {
  84.     clrscr();
  85.     printf("Enter (L)ock,(C)lear locks,(R)ead,(W)rite,(S)how,(Q)uit :");
  86.     c=getch();
  87.     printf("\n");
  88.  
  89.     if ((c==27)||(c=='q')||(c=='Q'))
  90.       exit(0);
  91.  
  92.     if ((c=='l')||(c=='L'))
  93.     {
  94.       printf("Enter start   : ");
  95.       scanf("%d",&start);
  96.       printf("Enter blk_size    : ");
  97.       scanf("%d",&blk_size);
  98.       if (!dos_lock(handle,(long)start,(long)blk_size))
  99.       {
  100.         printf("LOGGING LOCKING ERROR");
  101.         getch();
  102.       }
  103.     }
  104.  
  105.     if ((c=='c')||(c=='C'))
  106.     {
  107.       if(!clear_recs())
  108.       {
  109.         printf("CLEARING ERROR");
  110.         getch();
  111.       }
  112.     }
  113.  
  114.     if ((c=='r')||(c=='R'))
  115.     {
  116.       printf("Enter start   : ");
  117.       scanf("%d",&start);
  118.       printf("Enter blk_size    : ");
  119.       scanf("%d",&blk_size);
  120.       lseek(handle,(long)start,SEEK_SET);
  121.       i = read(handle,&buff,blk_size);
  122.       if (i!=blk_size)
  123.       {
  124.         printf("READ ERROR\n");
  125.         getch();
  126.       }
  127.       for (i=0;i!=blk_size;i++)
  128.         putch(buff[i]);
  129.       printf("\n");
  130.       getch();
  131.     }
  132.  
  133.     if ((c=='w')||(c=='W'))
  134.     {
  135.       printf("Enter start   : ");
  136.       scanf("%d",&start);
  137.       printf("Enter blk_size    : ");
  138.       scanf("%d",&blk_size);
  139.       lseek(handle,(long)start,SEEK_SET);
  140.       printf("Enter in the %d characters\n",blk_size);
  141.       for (i=0;i!=blk_size;i++)
  142.       {
  143.         buff[i]=getch();
  144.         putch(buff[i]);
  145.       }
  146.       printf("\n");
  147.       write(handle,&buff,blk_size);
  148.     }
  149.  
  150.     if ((c=='s')||(c=='S'))
  151.     {
  152.       for (i=0;i!=locks_on;i++)
  153.         printf("%d %d %d\n",lock_log[i].handle,(int)lock_log[i].start,(int)lock_log[i].blk_size);
  154.       getch();
  155.     }
  156.   }
  157. };